\documentclass[a4paper,10pt]{report}
\usepackage[francais]{babel}
\usepackage[utf8]{inputenc}
\usepackage[top=2cm, bottom=2cm, left=1.5cm, right=1.5cm]{geometry}
\usepackage{graphicx}


% Title Page
\title{Dossier Client/Serveur}
\author{Christophe VARGAS, Arnaud MAILLET}


\begin{document}
\maketitle
\tableofcontents

\chapter*{Cahier des charges détaillé}
\addcontentsline{toc}{chapter}{Cahier des charges détaillé}

\section*{Organisation du chat}
\addcontentsline{toc}{section}{Organisation du chat}

\par{Le chat est organisé en différents canaux d'échange. Sur ces canaux des utilisateurs peuvent discuter. Les canaux peuvent être privés ou publiques. Un canal publique est un canal que tout le monde peut rejoindre pour discuter alors qu'un canal privé est un canal accessible que grâce à une clé. Un canal peut être créé par n'importe quel utilisateur. Pour cela il faut qu'un utilisateur rejoigne un canal inexistant. Il deviendra ainsi super utilisateur de ce canal. Lors de la création d'un canal l'utilisateur peut indiquer une clé pour que le canal soit privé. Un super utilisateur peut expulser / bannir un utilisateur de son canal. Il peut aussi mettre ou enlever le statut de super utilisateur à un autre utilisateur. Par contre le super utilisateur qui a créé le channel ne peut perdre son statut de super utilisateur.}


\section*{Les utilisateurs en général}
\addcontentsline{toc}{section}{Les utilisateurs en général}

\par{
Chaque utilisateur est définie par : 
\begin{itemize}
 \item un pseudo unique
 \item un mot de passe qui garantie l'unicité de son pseudo
\end{itemize}
}

\section*{Echange de message}
\addcontentsline{toc}{section}{Echange de message}

\par{
Un utilisateur peut échanger des messages avec 1 ou n personnes dans un canal. Il peut aussi parler avec une seule personne dans une conversation privé.
}

\section*{Envoi de fichier (facultatif)}
\addcontentsline{toc}{section}{Envoi de fichier (facultatif)}

\par{Un utilisateur peut envoyer n'importe quel fichier à un autre utilisateur. Pour que le transfert se fasse, il suffit juste que l'autre utilisateur accepte le transfert.}

\section*{Echanges sécurisés}
\addcontentsline{toc}{section}{Echanges sécurisés}	

\par{Tout est crypté sur le chat grâce à une connection SSL. On utilisera un certificat AES-128/256 bits ( défini comme SECRET/TOP - SECRET par le gourvenement américain )}


\chapter*{Liste des cas d'utilisation du chat}
\addcontentsline{toc}{chapter}{Liste des cas d'utilisation du chat}

Voici la liste des cas d'utilisation fourni par le chat :\\
\\
\\
\\
\begin{center}
\includegraphics[width=185mm]{usecase.png}
\end{center}

\newpage

\chapter*{Diagrammes d'état transition}
\addcontentsline{toc}{chapter}{Diagrammes d'état transition}

\section*{Etat transition de la classe Canal}
\addcontentsline{toc}{section}{Etat transition de la classe Canal}

Voici le diagramme d'état transition pour un canal :\\
\\
\begin{center}
\includegraphics[width=75mm]{etattransitionCanal.png}
\end{center}
\newpage

\section*{Etat transition de la classe Utilisateur}
\addcontentsline{toc}{section}{Etat transition de la classe Utilisateur}

Voici le diagramme d'état transition pour un utilisateur :\\
\\
\\
\begin{center}
\includegraphics[width=100mm]{etattransitionUtilisateur.png}
\end{center}
\newpage

\chapter*{Diagramme de classe du Serveur}
\addcontentsline{toc}{chapter}{Diagramme de classe du Serveur}

Voici le diagramme de classe du Serveur :\\
\\
\\
\begin{center}
\includegraphics[width=120mm]{ClassServeur.png}
\end{center}
\newpage


\chapter*{Diagrammes de séquence des cas d'utilisation}
\addcontentsline{toc}{chapter}{Diagrammes de séquence des cas d'utilisation}

\section*{Connexion au chat}
\addcontentsline{toc}{section}{Connexion au chat}

Voici le diagramme de séquence :\\
\\
\\
\begin{center}
\includegraphics[width=180mm]{connexionChat.png}
\end{center}
\newpage

\section*{Déconnexion du chat}
\addcontentsline{toc}{section}{Déconnexion du chat}

Voici le diagramme de séquence :\\
\\
\\
\begin{center}
\includegraphics[width=180mm]{deconnexionChat.png}
\end{center}
\newpage

\section*{Envoyer message}
\addcontentsline{toc}{section}{Envoyer message}

Voici le diagramme de séquence :\\
\\
\\
\begin{center}
\includegraphics[width=180mm]{envoyerMessage.png}
\end{center}
\newpage

\section*{Inscription chat}
\addcontentsline{toc}{section}{Inscription chat}

Voici le diagramme de séquence :\\
\\
\\
\begin{center}
\includegraphics[width=180mm]{inscriptionChat.png}
\end{center}
\newpage

\section*{Lister canaux}
\addcontentsline{toc}{section}{Lister canaux}

Voici le diagramme de séquence :\\
\\
\\
\begin{center}
\includegraphics[width=160mm]{listerCanaux.png}
\end{center}
\newpage


\section*{Envoyer fichier}
\addcontentsline{toc}{section}{Envoyer fichier}

Voici le diagramme de séquence :\\
\\
\\
\begin{center}
\includegraphics[width=160mm]{envoyerFichier.png}
\end{center}
\newpage


\section*{Modifier parametres personnels}
\addcontentsline{toc}{section}{Modifier parametres personnels}

Voici le diagramme de séquence :\\
\\
\\
\begin{center}
\includegraphics[width=160mm]{modifierParametresPersonnels.png}
\end{center}
\newpage


\section*{Modifier password canal}
\addcontentsline{toc}{section}{Modifier password canal}

Voici le diagramme de séquence :\\
\\
\\
\begin{center}
\includegraphics[width=160mm]{modifierPasswordCanal.png}
\end{center}
\newpage


\section*{Expulser un utilisateur}
\addcontentsline{toc}{section}{Expulser un utilisateur}

Voici le diagramme de séquence :\\
\\
\\
\begin{center}
\includegraphics[width=180mm]{expulserUtilisateur.png}
\end{center}
\newpage


\section*{Bannir un utilisateur du canal}
\addcontentsline{toc}{section}{Bannir un utilisateur du canal}

Voici le diagramme de séquence :\\
\\
\\
\begin{center}
\includegraphics[width=180mm]{bannirUtilisateurCanal.png}
\end{center}
\newpage


\section*{Debannir un utilisateur du canal}
\addcontentsline{toc}{section}{Debannir un utilisateur du canal}

Voici le diagramme de séquence :\\
\\
\\
\begin{center}
\includegraphics[width=180mm]{deBannirUtilisateurCanal.png}
\end{center}
\newpage


\section*{Nouveau super utilisateur canal}
\addcontentsline{toc}{section}{Nouveau super utilisateur canal}

Voici le diagramme de séquence :\\
\\
\\
\begin{center}
\includegraphics[width=180mm]{nouveauSuperUtilisateur.png}
\end{center}
\newpage


\section*{Supprimer super utilisateur canal}
\addcontentsline{toc}{section}{Supprimer super utilisateur canal}

Voici le diagramme de séquence :\\
\\
\\
\begin{center}
\includegraphics[width=180mm]{supprimerSuperUtilisateur.png}
\end{center}
\newpage


\section*{Quitter canal}
\addcontentsline{toc}{section}{Quitter canal}

Voici le diagramme de séquence :\\
\\
\\
\begin{center}
\includegraphics[width=180mm]{quitterCanal.png}
\end{center}
\newpage

\section*{Supprimer canal}
\addcontentsline{toc}{section}{Supprimer canal}

Voici le diagramme de séquence :\\
\\
\\
\begin{center}
\includegraphics[width=180mm]{supprimerCanal.png}
\end{center}
\newpage

\section*{Rejoindre/Créer canal}
\addcontentsline{toc}{section}{Rejoindre/Créer canal}

Voici le diagramme de séquence :\\
\\
\\
\begin{center}
\includegraphics[width=180mm]{rejoindreCreerCanal.png}
\end{center}
\newpage


\chapter*{Définition du protocole}
\addcontentsline{toc}{chapter}{Définition du protocole}
\bigskip
\bigskip
Chaine = chaine UTF8 ( longueur 2 octets + chaine encodé en UTF )\\
code commande = entier de type short\\
\bigskip
\bigskip
\section*{Client vers Serveur}
\addcontentsline{toc}{section}{Client vers Serveur}
\bigskip
\bigskip
\begin{flushleft}
0 -\(>\)inscription au chat (COMMANDE\_INSCRIPTION\_CHAT)\\
envoi :\\
   1- pseudo : Chaine\\
   2 - password : Chaine\\
recoit :\\
   3 - Inscription reussie (COMMANDE\_INSCRIPTION\_OK) / Inscription échouée (COMMANDE\_ERREUR\_INSCRIPTION)\\
\bigskip
1 -\(>\)connection au chat (COMMANDE\_CONNECTION\_CHAT)\\
envoi :\\
   1 - pseudo : Chaine\\
   2 - password : Chaine\\
recoit :\\
   3 - Connection réussie (COMMANDE\_CONNECTION\_OK) / Connection échouée (COMMANDE\_ERREUR\_CONNECTION)\\
\bigskip
2 -\(>\)deconnection du chat (COMMANDE\_DECONNECTION\_CHAT)\\
\bigskip
3 -\(>\)liste des canaux d'un serveur (COMMANDE\_RECUPERER\_LISTE\_CANAUX)\\
recoit :\\
   1 - Recuperer liste des canaux (102-COMMANDE\_ENVOYER\_LISTE\_CANAUX)\\
\bigskip
4 -\(>\)rejoindre / créer canal (COMMANDE\_CREER\_REJOINDRE\_CANAL)\\
envoi :\\
   1 - nomCanal : Chaine\\
   2 - password : Chaine\\
recoit :\\
   3 - Utilisateur banni (-6-COMMANDE\_UTILISATEUR\_BANNI) / Mot de passe incorrect (-3-COMMANDE\_ERREUR\_PASSWORD) / raffraichir Canal (100-COMMANDE\_RAFFRAICHIR\_CANAL)\\
\bigskip
5 -\(>\)quitterCanal (COMMANDE\_QUITTER\_CANAL) :\\
envoi :\\	
   1 - nomCanal : Chaine\\
reçoit :\\	
   2 - raffraichir Canal (100-COMMANDE\_RAFFRAICHIR\_CANAL)\\
\bigskip
6 -\(>\)modifierPasswordCanal (COMMANDE\_MODIFIER\_PASSWORD\_CANAL)\\
envoi :\\
   1 - nomCanal : Chaine\\
   2 - password : Chaine\\
recoit :\\
   4 - Droits insuffisants (-5-COMMANDE\_ERREUR\_DROITS\_INSUFFISANTS\_CANAL ) / Droits suffisants et changement du password du canal(109-COMMANDE\_MODIFIER\_PASSWORD\_CANAL\_OK)\\
\bigskip
7 -\(>\)envoyer un message (COMMANDE\_ENVOYER\_MESSAGE)\\
envoi :\\
   1 - argument : Chaine (si commence par \# alors nom canal sinon nom de l'utilisateur)\\
   2 - message : Chaine\\
recoit :\\
   3 - Raffraichir message canal (112-COMMANDE\_RAFFRAICHIR\_MESSAGE\_CANAL) / Raffraichir message utilisateur(113-COMMANDE\_RAFFRAICHIR\_MESSAGE\_UTILISATEUR)\\
\bigskip
8 -\(>\)envoyer un fichier (COMMANDE\_ENVOYER\_UN\_FICHIER)\\
voir diagramme de sequence envoyerFichier\\
\bigskip
9 -\(>\)bannir un utilisateur (COMMANDE\_BANNIR\_UTILISATEUR\_CANAL )\\
envoi :\\
   1 - nomCanal : Chaine\\
   2 - utilisateur : Chaine\\
recoit :\\
   3 - Droits insuffisants (-5-COMMANDE\_ERREUR\_DROITS\_INSUFFISANTS\_CANAL ) / Droits suffisants et bannissement de l'utilisateur(108-COMMANDE\_BANNIR\_UTILISATEUR\_OK)\\
\bigskip
10 -\(>\)débannir un utilisateur (COMMANDE\_DEBANNIR\_UTILISATEUR\_CANAL )\\
envoi :\\
   1 - nomCanal : Chaine\\
   2 - utilisateur : Chaine\\
recoit :\\
   3 - Droits insuffisants (-5-COMMANDE\_ERREUR\_DROITS\_INSUFFISANTS\_CANAL ) / Droits suffisants et debannissement de l'utilisateur (110-COMMANDE\_DEBANNIR\_UTILISATEUR\_OK)\\
\bigskip
11 -\(>\)modifier paramètres personnels (COMMANDE\_MODIFIER\_PARAMETRES\_PERSONNELS)\\
envoi :\\
   1 - ancienPassword : Chaine\\
   2 - nouveauPassword : Chaine\\
recoit :\\
   3 - Mot de passe incorrect (-3-COMMANDE\_ERREUR\_PASSWORD) / Modifier paramètres personnels ok (111-COMMANDE\_MODIFIER\_PARAMETRES\_PERSONNELS\_OK)\\
\bigskip
12 -\(>\)nouveau super utilisateur (COMMANDE\_NOUVEAU\_SUPERUTILISATEUR)\\
envoi :\\
   1 - nomCanal : Chaine\\
   2 - pseudoDuNouveauSuperUtilisateur : Chaine\\
recoit :\\
   3 - Droits insuffisants (-5-COMMANDE\_ERREUR\_DROITS\_INSUFFISANTS\_CANAL ) / raffraichir Canal (100-COMMANDE\_RAFFRAICHIR\_CANAL)\\
\bigskip
13 -\(>\)supprimer super utilisateur (COMMANDE\_SUPPRIMER\_SUPERUTILISATEUR)\\
envoi :\\
   1 - nomCanal : Chaine\\
   2 - pseudoSuperUtilisateur : Chaine\\
recoit :\\
   3 - Droits insuffisants (-5-COMMANDE\_ERREUR\_DROITS\_INSUFFISANTS\_CANAL ) / raffraichir Canal (100-COMMANDE\_RAFFRAICHIR\_CANAL)\\
\bigskip
14 -\(>\)expulser utilisateur (COMMANDE\_EXPULSER\_UTILISATEUR\_CANAL)\\
envoi :\\
   1 - nomCanal : Chaine\\
   2 - pseudoAExpulser : Chaine\\
recoit :\\
   3 - Droits insuffisants (-5-COMMANDE\_ERREUR\_DROITS\_INSUFFISANTS\_CANAL ) / raffraichir Canal (100-COMMANDE\_RAFFRAICHIR\_CANAL)\\
\bigskip
15 -\(>\)supprimer canal (COMMANDE\_SUPPRIMER\_CANAL)\\
envoi :\\
   1 - nomCanal : Chaine
recoit :\\
   2 - Droits insuffisants (-5-COMMANDE\_ERREUR\_DROITS\_INSUFFISANTS\_CANAL ) / Canal supprimé (105-COMMANDE\_CANAL\_SUPPRIME)\\
\bigskip
16 -\(>\)requete envoi fichier refusée (COMMANDE\_REQUETE\_REFUSEE)\\
voir diagramme de sequence envoyerFichier\\
\bigskip
17 -\(>\)requete envoi fichier acceptée (COMMANDE\_REQUETE\_ACCEPTEE)\\
voir diagramme de sequence envoyerFichier\\
\bigskip
18 -\(>\)démarrer transfert (COMMANDE\_DEMARRER\_TRANSFERT)\\
voir diagramme de sequence envoyerFichier\\
\bigskip
\bigskip
\section*{Serveur vers Client}
\addcontentsline{toc}{section}{Serveur vers Client}
\bigskip
\bigskip
-1 -\(>\)Inscription échouée (COMMANDE\_ERREUR\_INSCRIPTION)\\
\bigskip
-2 -\(>\)Connection échouée (COMMANDE\_ERREUR\_CONNECTION)\\
\bigskip
-3 -\(>\)Mot de Passe incorrecte (COMMANDE\_ERREUR\_PASSWORD)\\
\bigskip
-4 -\(>\)l'utilisateur a refusé le fichier\\
\bigskip
-5 -\(>\)Droits insuffisants (COMMANDE\_ERREUR\_DROITS\_INSUFFISANTS\_CANAL)\\
\bigskip
-6 -\(>\)Utilisateur banni (COMMANDE\_ERREUR\_UTILISATEUR\_BANNI)\\
\bigskip
100 -\(>\)raffraichir Canal (COMMANDE\_RAFFRAICHIR\_CANAL) :\\
envoi :\\
   1 - nomCanal : Chaine\\
   2 - nombre d'utilisateurs : Entier (4 octets signés)\\
   3 - boucle qui envoit chaque utilisateur du canal sous forme de chaine\\
\bigskip
101 -\(>\)requete fichier (COMMANDE\_REQUETE\_FICHIER) :\\
voir diagramme de sequence envoyerFichier\\
\bigskip
102 -\(>\)Liste canaux (COMMANDE\_ENVOYER\_LISTE\_CANAUX)\\
   1 - nombre de canaux : Entier (4 octets signés)\\
   2 - boucle qui envoit chaque canal du serveur sous forme de chaine\\
\bigskip
103 -\(>\)Inscription réussie (COMMANDE\_INSCRIPTION\_OK)\\
\bigskip
104 -\(>\)Connection réussie (COMMANDE\_CONNECTION\_OK)\\
\bigskip
105 -\(>\)Canal supprimé (COMMANDE\_CANAL\_SUPPRIME)\\
envoi :\\
   1 - nomCanal : Chaine\\
\bigskip
106 -\(>\)Droit sur le canal insufisant (COMMANDE\_ERREUR\_CHANGER\_PASSWORD\_CANAL)\\
\bigskip
107 -\(>\)Le changement s'est bien déroulé  (COMMANDE\_CHANGER\_PASSWORD\_OK)\\
\bigskip
108 -\(>\)Droits suffisants et bannissement de l'utilisateur (COMMANDE\_BANNIR\_UTILISATEUR\_OK)\\
\bigskip
109 -\(>\)Droits suffisants et changement du password du canal (COMMANDE\_MODIFIER\_PASSWORD\_CANAL\_OK)\\
\bigskip
110 -\(>\)Droits suffisants et debannissement de l'utilisateur (COMMANDE\_DEBANNIR\_UTILISATEUR\_OK)\\
\bigskip
111 -\(>\)Modification paramètres personnels ok (COMMANDE\_MODIFIER\_PARAMETRES\_PERSONNELS\_OK)\\
\bigskip
112 -\(>\)Raffraichir message canal (COMMANDE\_RAFFRAICHIR\_MESSAGE\_CANAL)\\
envoi :\\
   1 - nomCanal : Chaine\\
   2 - message : Chaine\\
\bigskip
113 -\(>\)Raffraichir message utilisateur (COMMANDE\_RAFFRAICHIR\_MESSAGE\_UTILISATEUR)\\
   1 - pseudoEnvoyeur : Chaine\\
   2 - message : Chaine\\
\bigskip
114 -\(>\)destinataire refuse requete (COMMANDE\_DESTINATAIRE\_REFUSE\_REQUETE)\\
voir diagramme de sequence envoyerFichier\\
\bigskip
115 -\(>\)destinataire accepte requete (COMMANDE\_DESTINATAIRE\_ACCEPTE\_REQUETE)\\
voir diagramme de sequence envoyerFichier\\
\bigskip
116 -\(>\)envoi du fichier (COMMANDE\_ENVOI\_FICHIER)\\
voir diagramme de sequence envoyerFichier\\
\end{flushleft}

\newpage

\chapter*{Qualification du logiciel}
\addcontentsline{toc}{chapter}{Qualification du logiciel}

\par{
Cas d'utilisation spécifiés mais non implémentés :
\bigskip
\begin{itemize}
 \item Envoyer un fichier
 \item Changer mot de passe d'un canal
 \item Changer password d'un utilisateur
\end{itemize}
\bigskip
}
\bigskip
\par{
Cas d'utilisation fonctionnels :
\bigskip
\begin{itemize}
 \item Inscription au chat
 \item Connection au chat
 \item Déconnection du chat
 \item Créer / Rejoindre canal
 \item Quitter canal
 \item Expulser un utilisateur
 \item Bannir un utilisateur
 \item Supprimer un canal
 \item Débannir un utilisateur
 \item Donner droit super utilisateur
 \item Enlever droit super utilisateur
 \item Envoyer un message dans un canal
 \item Envoyer un message à un utilisateur en privé
 \item Lister les canaux du chat
\end{itemize}
}
\bigskip
\par{Possibilité de se parler à soi même mais cela ouvre 2 onglets, on reçoit en double le message dans le meme onglet. Lorsque un utilisateur quitte une conversation privée, il ne recevra pas le message de son correspondant, pour re recevoir des messages, faut qu'il créé un nouveau dialogue. Si jamais il y a une déconnection involontaire ou une action malicieuse de la part de l'utilisateur, il sera automatiquement déconnecté du serveur. ( Appel de la méthode déconnectionChat() du serveur ) }
\end{document}
